﻿Ext.EventObjectImpl = Ext.extend(Object, {
    //构造函数
    constructor: function (e) {
        if (e) {
            this.setEvent(e.browserEvent || e);
        }
    },

    //将原生的事件对象转换成新对象
    setEvent: function (e) {
        var me = this;
        if (e == me || (e && e.browserEvent)) {//如果e已经是一个Ext.EventObjectImpl对象
            return e;
        }
        me.browserEvent = e; //把原生的事件对象（e）赋给Ext.EventObjectImpl对象的browserEvent属性
        if (e) {
            me.type = e.type;

            //target 事件属性可返回事件的目标节点（触发该事件的节点），如生成事件的元素、文档或窗口。
            var node = e.target;

            //nodeType（节点类型）。1：元素、2：属性、3：文本、8：注释、9：文档  
            me.target = node && node.nodeType == 3 ? node.parentNode : node;


            me.xy = [e.pageX, e.pageY];//光标相对于事件所在的文档的水平和垂直位置（像素）
            me.timestamp = e.timeStamp; //返回事件生成的日期和时间。
        } else {
            me.target = null;
            me.xy = [0, 0];
        }
        return me;
    },

    //停止事件（preventDefault和stopPropagation）。
    stopEvent: function () {
        this.stopPropagation();
        this.preventDefault();
    },

    //阻止浏览器默认行为处理事件。
    preventDefault: function () {
        if (this.browserEvent) {
            this.browserEvent.preventDefault();
        }
    },

    //取消冒泡事件。
    stopPropagation: function () {
        if (this.browserEvent) {
            this.browserEvent.stopPropagation();
        }
    },

    //获取事件X坐标
    getPageX: function () {
        return this.xy[0];
    },

    //获取事件Y坐标
    getPageY: function () {
        return this.xy[1];
    },

    //获取事件的页面坐标
    getXY: function () {
        return this.xy;
    },

    /// <summary>
    /// 获取事件的目标对象
    /// </summary>
    /// <param name="selector">（可选的） 一个简易的选择符，用于筛选目标或查找目标的父级元素。</param>
    /// <param name="maxDepth">（可选的）搜索的最大深度（数字或是元素，默认为10||document.body）。</param>
    /// <param name="returnEl">（可选的） True表示为返回Ext.Element的对象而非DOM节点</param>
    /// <return>生成的Id</return>
    getTarget: function (selector, maxDepth, returnEl) {
        //Ext.fly = El.fly;
        return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);
    },

    //获取事件的时间
    getTime: function () {
        return this.timestamp;
    }
});

Ext.EventObject = new Ext.EventObjectImpl();

